#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

namespace  yan
{
	class string
	{
	public:
		string(const char* str = "")
		{
			if (!str)
			{
				str = "";
			}
			// _str = str; 不能将 "const char *" 类型的值分配到 "char *" 类型的实体	
			_str = new char[strlen(str) + 1];//还要加上\0的空间

			strcpy(_str, str);
		}

		
		////浅拷贝
		//string(const string& s)
		//	: _str(s._str)
		//{}

		//string& operator=(const string& s)
		//{
		//	_str = s._str;
		//	return *this;
		//}

        //一般写法
		/*
		string(const string& s)
		{
			_str = new char[strlen(s._str) + 1];
			strcpy(_str, s._str);
		}

		string& operator=(const string& s)
		{
			if (this != &s)
			{
				//先释放掉被赋值对象的空间，以免造成内存泄漏
				delete[] _str;

				_str = new char[strlen(s._str) + 1];
				strcpy(_str, s._str);

			}
			return *this;
		}*/
		//高级写法
		// 深拷贝
		string(const string& s)
			: _str(nullptr)
		{
			string strTemp(s._str);
			swap(_str, strTemp._str);
		}

		// 深拷贝
		// s2 = s1;   s1--->s--->strtemp
		string& operator=(string s)
		{
			swap(_str, s._str);
			return *this;
		}



		~string()
		{
			if (_str)
			{
				delete[] _str;
				_str = nullptr;
			}
		}

		void TestString1()
		{
			string s1("hello");
			string s2(s1);
		}

		void TestString2()
		{
			string s1("hello");
			string s2("bit");

			s2 = s1;
		}

	private:

		char* _str;
	};
}


int main()
{
	yan::string ss;
	ss.TestString1();
	ss.TestString2();
	ss.~string();
	_CrtDumpMemoryLeaks();
	return 0;
}
